package dragon.core.runtime;

import org.junit.Test;

import dragon.core.exception.ExceptionHandler;
import dragon.core.io.FileHandler;
import dragon.core.util.StringUtils;

public class GeneratorJavaFiles {

	String packageName = "crm.customer";
	String poName = "crm.table.CrmCustomerComplaint";
	String modelName = "Complaint";

	String _n = "\n";

	String _t = "\t";

	String dot = ".";

	String semicolon = ";";

	/**
	 * 默认源文件目录
	 */
	private String defaultSourceFolder = "src";

	/**
	 * 默认class目录
	 */
	private String defaultOutputFolder = "bin";

	private String srcPath;

	private String packagePath = "";

	/**
	 * 根据指定的数据表生成action类，dao类，daoImpl类
	 * 
	 * @throws ExceptionHandler
	 */
	@Test
	public void generate() throws ExceptionHandler {

		if (!StringUtils.isPackageNameCorrect(packageName)) {
			throw new ExceptionHandler("给定的包名不正确：" + packageName);
		}
		packageName = packageName.trim().toLowerCase();

		srcPath = FileHandler.getClassRootPath();
		srcPath = srcPath.replace(defaultOutputFolder, defaultSourceFolder);

		if (!"".equals(packageName)) {
			packagePath = packageName;
			packagePath = packagePath.replaceAll("\\.", "/");
			if (!packagePath.endsWith("/")) {
				packagePath += "/";
			}
		}
		packagePath = srcPath + packagePath;

		// 创建子包
		createSubPackage();

		// 创建文件
		createActionFile();
		// createDaoFile();
		// createDaoImplFile();

	}

	public void createSubPackage() {

		System.out.println("创建子包");
		// action 包
		String actionPackagePath = packagePath + "action";

		// dao,dao/impl 包
		String daoImplPackagePath = packagePath + "dao/impl";

		FileHandler.mkDir(actionPackagePath);
		FileHandler.mkDir(daoImplPackagePath);
	}

	public void createActionFile() throws ExceptionHandler {
		System.out.println("创建action文件");
		StringBuilder cs = new StringBuilder();
		// package
		if (!"".equals(packageName)) {
			cs.append("package ").append(packageName).append(".action").append(semicolon).append(_n).append(_n);
		}

		// import域
		cs.append("import java.io.IOException;").append(_n);
		cs.append("import javax.servlet.http.HttpServletResponse;").append(_n);
		cs.append("import dragon.core.db.DML;").append(_n);
		cs.append("import dragon.core.db.table.SysUser;").append(_n);
		cs.append("import dragon.core.exception.ExceptionHandler;").append(_n);
		cs.append("import dragon.core.page.Page;").append(_n);
		cs.append("import ").append(packageName).append(".dao.").append(modelName).append("Dao;").append(_n);
		cs.append("import ").append(packageName).append(".dao.impl.").append(modelName).append("DaoImpl;").append(_n);
		cs.append("import ").append(poName).append(semicolon).append(_n);
		cs.append("import ejw.RequestHandler;").append(_n);
		cs.append("import ejw.ServerInterface;").append(_n);

		// 添加class头部
		cs.append(_n);
		cs.append("/**").append(_n);
		cs.append(" * ").append(modelName).append(_n);
		cs.append(" */").append(_n);
		String className = StringUtils.table2Class(modelName + "Handler");
		cs.append("public class ").append(className).append(" extends RequestHandler {").append(_n);

		// request方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("默认列表方法").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void request() throws ExceptionHandler {").append(_n);

		cs.append(_t).append(_t).append("String itemsPerPage = this.getServerInterface().getParameter(\"rows\");// 每页显示数据条数").append(_n);
		cs.append(_t).append(_t).append("String targetPage = this.getServerInterface().getParameter(\"page\");// 目标页码").append(_n);
		cs.append(_t).append(_t).append("String sql = \"\";").append(_n);
		cs.append(_t).append(_t).append("Page page = new Page();").append(_n);
		cs.append(_t).append(_t).append("page.setItemsPerPage(itemsPerPage);").append(_n);
		cs.append(_t).append(_t).append("page.setTargetPage(targetPage);").append(_n);
		cs.append(_t).append(_t).append("page.setSql(sql);").append(_n);
		cs.append(_t).append(_t).append("DML.query(page);").append(_n);
		cs.append(_t).append(_t).append("printWrite(getServerInterface(), page.getJsonMapResult());").append(_n);

		cs.append(_t).append("}").append(_n);

		// add方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("增加").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void add() throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append(_n);
		cs.append(_t).append("}").append(_n);

		// mod方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("修改").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void mod() throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append(_n);
		cs.append(_t).append("}").append(_n);

		// delete方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("删除").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void del() throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append(_n);
		cs.append(_t).append("}").append(_n);

		// printWrite方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("打印字符串").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void printWrite(ServerInterface sif, String flg) {").append(_n);

		cs.append(_t).append(_t).append("HttpServletResponse response = sif.getServletResponse();").append(_n);
		cs.append(_t).append(_t).append("response.setCharacterEncoding(\"UTF-8\");").append(_n);
		cs.append(_t).append(_t).append("try {").append(_n);
		cs.append(_t).append(_t).append(_t).append("response.getWriter().write(flg);").append(_n);
		cs.append(_t).append(_t).append("} catch (IOException e) {").append(_n);
		cs.append(_t).append(_t).append(_t).append("e.printStackTrace();").append(_n);
		cs.append(_t).append(_t).append("}").append(_n);

		cs.append(_t).append("}").append(_n);

		// 添加class尾部
		cs.append("}");

		// 输出到文件
		String javaFilePath = packagePath + "action/" + className + ".java";
		FileHandler.createPlainTextFile(javaFilePath, cs.toString(), null);
	}

	public void createDaoFile() throws ExceptionHandler {
		System.out.println("创建dao文件");
		StringBuilder cs = new StringBuilder();
		// package
		if (!"".equals(packageName)) {
			cs.append("package ").append(packageName).append(".dao").append(semicolon).append(_n).append(_n);
		}

		// import域
		cs.append("import dragon.core.exception.ExceptionHandler").append(semicolon).append(_n);
		cs.append("import ").append(poName).append(semicolon).append(_n);

		// 添加class头部
		cs.append(_n);
		cs.append("/**").append(_n);
		cs.append(" * ").append(modelName).append(_n);
		cs.append(" */").append(_n);
		String className = StringUtils.table2Class(modelName + "Dao");
		cs.append("public interface ").append(className).append(" {").append(_n);

		String po = poName.substring(poName.lastIndexOf(".") + 1);

		// get方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("加载指定对象").append(_n);
		cs.append(_t).append(" * @param ").append("id 主键").append(_n);
		cs.append(_t).append(" * @return 指定对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public ").append(po).append(" get(String id) throws ExceptionHandler;").append(_n);

		// add方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("增加").append(_n);
		cs.append(_t).append(" * @param ").append("po 实体对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void add(").append(po).append(" po").append(") throws ExceptionHandler;").append(_n);

		// mod方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("修改").append(_n);
		cs.append(_t).append(" * @param ").append("po 实体对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void mod(").append(po).append(" po").append(") throws ExceptionHandler;").append(_n);

		// delete方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("删除").append(_n);
		cs.append(_t).append(" * @param ").append("ids 主键，多个以逗号分割").append(_n);
		cs.append(_t).append(" * @return").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public int del(String ids) throws ExceptionHandler;").append(_n);

		// 添加class尾部
		cs.append("}");

		// 输出到文件
		String javaFilePath = packagePath + "dao/" + className + ".java";
		FileHandler.createPlainTextFile(javaFilePath, cs.toString(), null);
	}

	public void createDaoImplFile() throws ExceptionHandler {
		System.out.println("创建daoimpl文件");
		StringBuilder cs = new StringBuilder();
		// package
		if (!"".equals(packageName)) {
			cs.append("package ").append(packageName).append(".dao.impl").append(semicolon).append(_n).append(_n);
		}

		// import域
		cs.append("import dragon.core.db.DML;").append(_n);
		cs.append("import dragon.core.db.id.IDGenerator;").append(_n);

		String daoName = StringUtils.table2Class(modelName + "Dao");
		cs.append("import dragon.core.exception.ExceptionHandler").append(semicolon).append(_n);
		cs.append("import ").append(poName).append(semicolon).append(_n);
		cs.append("import ").append(packageName).append(".dao.").append(daoName).append(semicolon).append(_n);

		// 添加class头部
		cs.append(_n);
		cs.append("/**").append(_n);
		cs.append(" * ").append(modelName).append(_n);
		cs.append(" */").append(_n);
		String className = StringUtils.table2Class(modelName + "DaoImpl");
		cs.append("public class ").append(className).append(" implements ").append(daoName).append(" {").append(_n);

		String po = poName.substring(poName.lastIndexOf(".") + 1);

		// get方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("加载指定对象").append(_n);
		cs.append(_t).append(" * @param ").append("id 主键").append(_n);
		cs.append(_t).append(" * @return 指定对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public ").append(po).append(" get(String id) throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append("return (").append(po).append(") DML.loadObject(").append(po).append(".class, \"where id=?\", id);").append(_n);
		cs.append(_t).append("}").append(_n);

		// add方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("增加").append(_n);
		cs.append(_t).append(" * @param ").append("po 实体对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void add(").append(po).append(" po").append(") throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append("DML.saveOrUpdateObject(po);").append(_n);
		cs.append(_t).append("}").append(_n);

		// mod方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("修改").append(_n);
		cs.append(_t).append(" * @param ").append("po 实体对象").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public void mod(").append(po).append(" po").append(") throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append("DML.saveOrUpdateObject(po);").append(_n);
		cs.append(_t).append("}").append(_n);

		// delete方法
		cs.append(_n);
		cs.append(_t).append("/**").append(_n);
		cs.append(_t).append(" * ").append("删除").append(_n);
		cs.append(_t).append(" * @param ").append("ids 主键，多个以逗号分割").append(_n);
		cs.append(_t).append(" * @return").append(_n);
		cs.append(_t).append(" * @throws ExceptionHandler").append(_n);
		cs.append(_t).append(" */").append(_n);
		cs.append(_t).append("public int del(String ids) throws ExceptionHandler {").append(_n);
		cs.append(_t).append(_t).append("return DML.executeUpdate(\"delete from \" + ").append(po).append(".tableName + \" where id in(\" + ids + \")\");").append(_n);
		cs.append(_t).append("}").append(_n);

		// 添加class尾部
		cs.append("}");

		// 输出到文件
		String javaFilePath = packagePath + "dao/impl/" + className + ".java";
		FileHandler.createPlainTextFile(javaFilePath, cs.toString(), null);
	}
}
